package src.hash;

import java.util.ArrayList;
import java.util.List;

public class no1002 {
    //查找共用字符，数组作hash表

    //注意是字符串数组，因此遍历到每个数组元素时，仍需遍历字符串内的每个字符，相当于两层for循环遍历
    public List<String> commonChars(String[] words) {
        ArrayList<String> res = new ArrayList<>();

        int[] hash = new int[26];  //第一个字符串的hash数组
        for (int i = 0; i < words[0].length(); i++) {
            hash[words[0].charAt(i) - 'a']++;  //words[0]是一个字符串，仍需取它 i 处的字符
        }
        //外层 i 遍历数组，内层 j 遍历串中的字符
        for (int i = 1; i < words.length; i++) {
            int[] temp = new int[26];  //在for中定义数组，每一轮循环都会为当前字符串建立一个hash数组
            for (int j = 0; j < words[i].length(); j++) {
                temp[words[i].charAt(j) - 'a']++;
            }

            //更新hash表，保证hash里统计26个字符在所有字符串里出现的最小次数
            //此时相当于数组有几个串，就有几个hash数组。hash数组每一列取最小值，即一个字符在所有串里出现的最小次数了
            for (int k = 0; k < 26; k++) {
                hash[k] = Math.min(hash[k], temp[k]);
            }
        }
        for (int i = 0; i < 26; i++) {
            while (hash[i] != 0) {  //注意这里是while，不是if。因为一个字母出现多次，都要加到list里，用if只能加一次
                //res.add(words[i]);  //words[i]是次数，不是字符，要转为字符再加到list
                char c = (char) (i + 'a');
                res.add(String.valueOf(c));
                hash[i]--;
            }
        }
        return res;

    }
}
